#!/usr/bin/bash

#--------------------------------添加错误捕获-------------------------------------#
# -e 当命令失败时, 退出脚本
# -u 当使用未定义的变量时, 退出脚本
# -o pipefail 当管道中的任何命令失败时, 退出脚本
# set -euo pipefail
# trap 'echo "error: 脚本在行 $LINENO 出现错误: $BASH_COMMAND"' ERR

#----------------------------------环境变量---------------------------------------#
RED='\E[1;31m'                              # 红
GREEN='\E[1;32m'                            # 绿
YELOW='\E[1;33m'                            # 黄
BLUE='\E[1;34m'                             # 蓝
PINK='\E[1;35m'                             # 粉红
SHAN='\E[33;5m'                             # 黄色闪烁警示
RES='\E[0m'                                 # 清除颜色
INFO='√'                                    # 信息输出显示符
ERROR='×'                                   # 错误输出显示符
WARN='!'                                    # 警告输出显示符
Version="v0.0.1"                            # 版本号

#----------------------------------函数模块---------------------------------------#
# PrintInfo 打印正常信息
PrintInfo() {
    Green "[${INFO}] ${1}"
}

# PrintError 打印错误信息
PrintError() {
    Red "[${ERROR}] ${1}"
}

# PrintWarn 打印警告信息
PrintWarn() {
    Yellow "[${WARN}] ${1}"
}

# Red 输出红色信息
Red() {
    echo -e "${RED}${1}${RES}"
}

# Green 输出绿色信息
Green() {
    echo -e "${GREEN}${1}${RES}"
}

# Yellow 输出黄色信息
Yellow() {
    echo -e "${YELOW}${1}${RES}"
}

# Pink 输出粉色信息
Pink() {
    echo -e "${PINK}${1}${RES}"
}

# Blue 输出蓝色信息
Blue() {
    echo -e "${BLUE}${1}${RES}"
}

# Shan 输出黄色闪烁信息
Shan() {
    echo -e "${SHAN}${1}${RES}"
}

# PrintHelp 打印帮助信息
PrintHelp() {
    local list
    local item
    # 定义一个列表, 每个元素包含两个部分, 用'.'分隔
    list=(
        "1.[-h|--help],获取帮助信息;"
        "2.[-v|--version],输出版本信息;"
        "3.[-f|--file],测试参数;"
    )
    # 输出分隔线
    Yellow "$(printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' '-')"
    Green " app-help:"
    for item in "${list[@]}"; do
        local list1
        # 提取列表项的第一个元素, 并使用 Pink 函数进行颜色处理
        list1=$(Pink "$(echo "${item}" | awk -F'.' '{print $1}')")
        local list2
        # 提取列表项的第二个元素
        list2=$(echo "${item}" | awk -F'.' '{print $2}')
        echo "      ${list1}.${list2}"
    done
    # 输出分隔线
    Yellow "$(printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' '-')"
}

# 定义一个函数, 用于输出版本信息
ShowVersion() {
    echo "$0 Version: ${Version}"
}

main() {
    # 捕获错误
    trap 'echo "error: 脚本在行 $LINENO 出现错误: $BASH_COMMAND"' ERR

    # 检查是否提供了足够的参数
    if [ "$#" -lt 1 ]; then
        PrintError "Usage: $0 <command> [options]"
        PrintHelp
        exit 1
    fi

    # 解析命令行参数
    while [[ $# -gt 0 ]]; do
        case "$1" in
        -h | --help)
            PrintHelp
            exit 0
            ;;
        -v | --version)
            ShowVersion
            exit 0
            ;;
        -f | --file)
            # 测试参数
            if [ -z "$2" ]; then
                PrintError "参数 -f 或 --file 后面必须跟一个文件名"
                exit 1
            fi
            # 将文件名存储在变量中
            FileName="$2"
            # 输出文件名
            PrintInfo "文件名: $FileName"
            # 丢弃前两个参数
            shift 2
            exit 0
            ;;
        *)
            PrintError "未知参数: $1"
            PrintHelp
            exit 1
            ;;
        esac

        # 丢弃已处理的参数
        shift
    done
}

#-----------------------------------main-----------------------------------------#
main "$@"
